<?php

///////////////////////////////////////////////////////////////////////////////
//
// database.class.php
//
///////////////////////////////////////////////////////////////////////////////
//
// Esta clase se implemento para el manejo de la base de datos de MySql
//
// Nota para evitar algun conflicto de  codificacion se omitiran las tildes y �
// 
// Autor: Juan Diego Ocampo Q.
// Fecha de Creaci�n: 11/04/2008
// 
// Modificaciones:
// 1) A los redirect se les est� enviando el segundo parametro para que muestre 
//    un mensaje cuando no puede enviar a la pagina de error. (Juan Manuel - 30/09/08)
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// class Database
// Se utiliza para manejar la base de datos de Mysql.
///////////////////////////////////////////////////////////////////////////////
class Database {

    //////////////////////////////////////////////////////////////////////////////////////
    // nombre de usuario de la base de datos para la conexion
    //////////////////////////////////////////////////////////////////////////////////////
    var $login;
    //////////////////////////////////////////////////////////////////////////////////////
    // password de usuario de la base de datos para la conexion
    //////////////////////////////////////////////////////////////////////////////////////
    var $password;
    //////////////////////////////////////////////////////////////////////////////////////
    // nombre de usuario de la base de datos para la conexion
    //////////////////////////////////////////////////////////////////////////////////////
    var $host;
    //////////////////////////////////////////////////////////////////////////////////////
    // nonbre/ubicacion del host de la base de datos
    //////////////////////////////////////////////////////////////////////////////////////
    var $conexion;
    //////////////////////////////////////////////////////////////////////////////////////
    // nonbre de la base de datos
    //////////////////////////////////////////////////////////////////////////////////////
    var $nombre;
    //////////////////////////////////////////////////////////////////////////////////////
    // indica si se imprime el error o se redireccionar a una pagina de error generico
    //////////////////////////////////////////////////////////////////////////////////////
    var $debug;
    //////////////////////////////////////////////////////////////////////////////////////
    // url a redireccionar en caso de error
    //////////////////////////////////////////////////////////////////////////////////////
    var $urlError;
    //////////////////////////////////////////////////////////////////////////////////////
    // mensaje a mostrar en caso de error
    //////////////////////////////////////////////////////////////////////////////////////
    var $msgError;

    //////////////////////////////////////////////////////////////////////////////////////
    // Constructor de clase.
    // inicializa los atributos de la clase con los valores de las constantes del archivo
    // de configuracion
    //
    //
    // parameter:
    // return:
    // access public
    //
    // Autor: Juan Diego Ocampo Q.
    // Fecha de Creacion: 11/04/2008
    //////////////////////////////////////////////////////////////////////////////////////
    function Database() {
        require_once 'include/reg.config.php';
        $this->login = DATABASE_USER;
        $this->password = DATABASE_PASSWORD;
        $this->host = DATABASE_HOST;
        $this->nombre = DATABASE_NAME;
        $this->conexion = false;
        $this->debug = true;
        $this->urlError = URL_ERROR;
        $this->msgError = MSG_ERROR;
    }

    //////////////////////////////////////////////////////////////////////////////////////
    // crea la conexion y selecciona la base de datos.
    //
    //
    // parameter:
    // return:
    // access public
    //
    // Autor: Juan Diego Ocampo Q.
    // Fecha de Creacion: 11/04/2008
    //////////////////////////////////////////////////////////////////////////////////////
    function dbConnect() {
        $conexion = mysql_connect("localhost", "root", "root");
        if ($conexion != false) {
            if (mysql_select_db("dbpasantiaeam")) {
                $this->conexion = $conexion;
            } else {
                if ($this->debug == true) {
                    echo "<h2>Error al seleccionar la base de datos " . $this->nombre . "</h2>";
                    echo "<p><b>MySQL Error</b>: " . mysql_error();
                    die();
                } else {
                    //////////////////////////////////////////////////////////
                    // para hacer uso de estas lineas se debe colocar la variable
                    //debug = false
                    //ademas se debe eliminar todos espacios y html para poder
                    //hacer buen uso del header, y ahy si funcionar mostrar
                    // el mensaje de error
                    ////////////////////////////////////////////////////////////
                    header("Location: ./$this->urlError");
                    //redirect($this->urlError,$this->msgError);
                    die();
                }
            }
        } else {
            if ($this->debug == true) {
                echo "<h2>Error al conectar a " . $this->host . " con el usuario " . $this->login . "</h2>";
                echo "<p><b>MySQL Error</b>: " . mysql_error();
                die();
            } else {
                redirect($this->urlError, $this->msgError);
                die();
            }
        }
    }

    //////////////////////////////////////////////////////////////////////////////////////
    // cierra la conexion a la base de datos.
    //
    //
    // parameter:
    // return:
    // access public
    //
    // Autor: Juan Diego Ocampo Q.
    // Fecha de Creacion: 11/04/2008
    //////////////////////////////////////////////////////////////////////////////////////
    function dbDisconnect() {
        mysql_close();
    }

    //////////////////////////////////////////////////////////////////////////////////////
    // envia una sentencia sql al motor de la base de datos
    //
    //
    // parameter: sentencia sql
    // return: el id de la consulta (idquery)
    // access public
    //
    // Autor: Juan Diego Ocampo Q.
    // Fecha de Creacion: 11/04/2008
    //////////////////////////////////////////////////////////////////////////////////////
    function dbQuery($sql) {
        $qid = mysql_query($sql);
        if ($qid != false) {
            return $qid;
        } else {
            if ($this->debug == true) {
                echo "<h2>No se pudo ejecutar la consulta, verifique los datos ingresados anteriormente</h2>";
                echo "<pre>" . $sql . "</pre>";
                echo "<p><b>MySQL Error</b>: " . mysql_error();
                die();
            } else {
                redirect($this->urlError, $this->msgError);
                die();
                //return -1;
            }
        }
    }

    //////////////////////////////////////////////////////////////////////////////////////
    // retorna un registro de la base de datos
    //
    //
    // parameter: el id de la consulta (idquery)
    // return: en un arreglo indexado y asociativo
    // return: false en caso de no haber mas registros
    // access public
    //
    // Autor: Juan Diego Ocampo Q.
    // Fecha de Creacion: 11/04/2008
    //////////////////////////////////////////////////////////////////////////////////////
    function dbFetchArray($qid) {
        return mysql_fetch_array($qid);
    }

    //////////////////////////////////////////////////////////////////////////////////////
    // retorna un registro de la base de datos
    //
    //
    // parameter: el id de la consulta (idquery)
    // return: en un arreglo indexado
    // return: false en caso de no haber mas registros
    // access public
    //
    // Autor: Juan Diego Ocampo Q.
    // Fecha de Creacion: 11/04/2008
    //////////////////////////////////////////////////////////////////////////////////////
    function dbFetchRow($qid) {
        return mysql_fetch_row($qid);
    }

    //////////////////////////////////////////////////////////////////////////////////////
    // retorna un registro de la base de datos
    //
    //
    // parameter: el id de la consulta (idquery)
    // return: en un arreglo asociativo
    // return: false en caso de no haber mas registros
    // access public
    //
    // Autor: Juan Diego Ocampo Q.
    // Fecha de Creacion: 11/04/2008
    //////////////////////////////////////////////////////////////////////////////////////
    function dbFetchAssoc($qid) {
        return mysql_fetch_assoc($qid);
    }

    //////////////////////////////////////////////////////////////////////////////////////
    // retorna un registro de la base de datos
    //
    //
    // parameter: el id de la consulta (idquery)
    // return: en un objeto
    // return: false en caso de no haber mas registros
    // access public
    //
    // Autor: Juan Diego Ocampo Q.
    // Fecha de Creacion: 11/04/2008
    //////////////////////////////////////////////////////////////////////////////////////
    function dbFetchObject($qid) {
        return mysql_fetch_object($qid);
    }

    //////////////////////////////////////////////////////////////////////////////////////
    // retorna numero de registros arrojados por la consulta
    //
    //
    // parameter: el id de la consulta (idquery)
    // return: numero de registros arrojados por la consulta
    // access public
    //
    // Autor: Juan Diego Ocampo Q.
    // Fecha de Creacion: 11/04/2008
    //////////////////////////////////////////////////////////////////////////////////////
    function dbNumRows($qid) {
        return mysql_num_rows($qid);
    }

    //////////////////////////////////////////////////////////////////////////////////////
    // retorna numero de registros afectados por la consulta
    //
    //
    // parameter: el id de la consulta (idquery)
    // return: numero de registros afectados por la consulta
    // access public
    //
    // Autor: Juan Diego Ocampo Q.
    // Fecha de Creacion: 11/04/2008
    //////////////////////////////////////////////////////////////////////////////////////
    function dbAffectedRows($qid) {
        return mysql_affected_rows($qid);
    }

    //////////////////////////////////////////////////////////////////////////////////////
    // retorna codigo (id) del ultimo registro insertado
    //
    //
    // parameter:
    // return: codigo (id) del ultimo registro insertado
    // access public
    //
    // Autor: Juan Diego Ocampo Q.
    // Fecha de Creacion: 11/04/2008
    //////////////////////////////////////////////////////////////////////////////////////
    function dbInsertId() {
        return mysql_insert_id();
    }

    //////////////////////////////////////////////////////////////////////////////////////
    // libera los recursos usados por la consulta
    //
    //
    // parameter: el id de la consulta (idquery)
    // return: int
    // access public
    //
    // Autor: Juan Diego Ocampo Q.
    // Fecha de Creacion: 11/04/2008
    //////////////////////////////////////////////////////////////////////////////////////
    function dbFreeResult($qid) {
        return mysql_free_result($qid);
    }

    //////////////////////////////////////////////////////////////////////////////////////
    // retorna el numero de campos arrojados pos la projeccion de la consulta
    //
    //
    // parameter: el id de la consulta (idquery)
    // return: numero de campos arrojados pos la projeccion de la consulta
    // access public
    //
    // Autor: Juan Diego Ocampo Q.
    // Fecha de Creacion: 11/04/2008
    //////////////////////////////////////////////////////////////////////////////////////
    function dbNumFields($qid) {
        return mysql_num_fields($qid);
    }

    //////////////////////////////////////////////////////////////////////////////////////
    // retorna nombre del campo especificado de la projeccion de la consulta
    //
    //
    // parameter: $qid id de la consulta (idquery)
    // parameter: $indice posicion del campo
    // return: numero de campos arrojados pos la projeccion de la consulta
    // access public
    //
    // Autor: Juan Diego Ocampo Q.
    // Fecha de Creacion: 11/04/2008
    //////////////////////////////////////////////////////////////////////////////////////
    function dbFieldName($qid, $indice) {
        return mysql_field_name($qid, $indice);
    }

    //////////////////////////////////////////////////////////////////////////////////////
    // posiciona el puntero de la consulta en el indice especificado
    //
    //
    // parameter: $qid id de la consulta (idquery)
    // parameter: $indice posicion de la fila o registro
    // return: numero de campos arrojados pos la projeccion de la consulta
    // access public
    //
    // Autor: Juan Diego Ocampo Q.
    // Fecha de Creacion: 11/04/2008
    //////////////////////////////////////////////////////////////////////////////////////
    function dbDataSeek($qid, $indice) {
        return mysql_data_seek($qid, $indice);
    }

    //////////////////////////////////////////////////////////////////////////////////////
    // Inserta un registro en la base de datos
    //
    //
    // parameter: $datos areglo asociativo
    // parameter: $tabla nombre de la tabla en la que ingresa el registro
    // return: true en caso de exito
    // return: false en caso de no exito
    // access public
    //
    // Autor: Juan Diego Ocampo Q.
    // Fecha de Creacion: 11/04/2008
    //////////////////////////////////////////////////////////////////////////////////////
    function dbInsert($datos, $tabla) {
        $fields = array();
        $values = array();

        foreach ($datos as $key => $val) {
            $fields[] .= $key;
            $values[] .= "'" . $val . "'";
        }

        $sql_insert = "INSERT INTO " . $tabla . " (" . implode(",", $fields) . ") VALUES(" . implode(",", $values) . ")";
        if ($this->dbQuery($sql_insert) != false) {
            return true;
        } else {
            return false;
        }
    }

    //////////////////////////////////////////////////////////////////////////////////////
    // Actualiza un registro en la base de datos
    //
    //
    // parameter: $datos areglo asociativo
    // parameter: $tabla nombre de la tabla en la que ingresa el registro
    // return: true en caso de exito
    // return: false en caso de no exito
    // access public
    //
    // Autor: Juan Diego Ocampo Q.
    // Fecha de Creacion: 11/04/2008
    //////////////////////////////////////////////////////////////////////////////////////
    function dbUpdate($datos, $tabla, $id, $camp="id") {
        $fields_vals = array();

        foreach ($datos as $key => $val) {
            $fields_vals[] .= $key . "='" . $val . "'";
        }

        $query = "UPDATE " . $tabla . " SET " . implode(",", $fields_vals) . " WHERE " . $camp . "='" . $id . "'";
        if ($this->dbQuery($query) != false) {
            return true;
        } else {
            return false;
        }
    }

    //////////////////////////////////////////////////////////////////////////////////////
    // Devuelve el contenido de un campo de un resultado
    //
    //
    // parameter: $qid el id de la consulta (idquery)
    // parameter: $campo nombre del campo (o alias)
    // return: valor del campo especificado
    // access public
    //
    // Autor: Juan Diego Ocampo Q.
    // Fecha de Creacion: 11/04/2008
    //////////////////////////////////////////////////////////////////////////////////////
    function dbResult($qid, $campo) {
        return mysql_result($qid, 0, $campo);
    }

    //////////////////////////////////////////////////////////////////////////////////////
    // Bloquea una tabla a modo de escritura
    //
    //
    // parameter: $tabla nombre de la tabla
    // return: true en caso de exito
    // return: false en caso de no exito
    // access public
    //
    // Autor: Juan Diego Ocampo Q.
    // Fecha de Creacion: 11/04/2008
    //////////////////////////////////////////////////////////////////////////////////////
    function dbLockTables($tabla) {
        $query = "LOCK TABLES " . $tabla . " WRITE; ";
        if ($this->dbQuery($query) != false) {
            return true;
        } else {
            return false;
        }
    }

    //////////////////////////////////////////////////////////////////////////////////////
    // Desbloquea las tablas que se encuentren bloquea una tabla a modo de escritura
    //
    //
    // parameter:
    // return: true en caso de exito
    // return: false en caso de no exito
    // access public
    //
    // Autor: Juan Diego Ocampo Q.
    // Fecha de Creacion: 11/04/2008
    //////////////////////////////////////////////////////////////////////////////////////
    function dbUnlockTables($tabla) {
        $query = "UNLOCK TABLES;";
        if ($this->dbQuery($query) != false) {
            return true;
        } else {
            return false;
        }
    }

    //////////////////////////////////////////////////////////////////////////////////////
    // inicializa los valores del debug
    //
    //
    // parameter: valor booleano
    // access public
    //
    // Autor: Juan Diego Ocampo Q.
    // Fecha de Creacion: 11/04/2008
    //////////////////////////////////////////////////////////////////////////////////////
    function debug($valor) {
        $this->debug = $valor;
    }

    //////////////////////////////////////////////////////////////////////////////////////
    // retorna la version de la base de datos
    //
    //
    // parameter:
    // access public
    //
    // Autor: Juan Diego Ocampo Q.
    // Fecha de Creacion: 11/04/2008
    //////////////////////////////////////////////////////////////////////////////////////
    function dbVersion() {
        $result = $this->dbQuery("SELECT VERSION() AS version");
        if ($result != false && $this->dbNumRows($result) > 0) {
            $row = $this->dbFetchArray($result);
            return $row["version"];
        } else {
            $result = $this->dbQuery("SHOW VARIABLES LIKE 'version'");
            if ($result != FALSE && $this->dbNumRows($result) > 0) {
                $row = $this->dbFetchRow($result);
                return $row["version"];
            }
        }
        return -1;
        //return '3.21.0';
    }

    //////////////////////////////////////////////////////////////////////////////////////
    // Constructor de clase.
    // inicializa los atributos de la clase con los valores de las constantes del archivo
    // de configuracion
    //
    //
    // parameter:
    // return:
    // access public
    //
    // Autor: Juan Diego Ocampo Q.
    // Fecha de Creacion: 11/04/2008
    //////////////////////////////////////////////////////////////////////////////////////
    function setAtributo($atributo, $valor) {
        switch ($atributo) {
            case "login": $this->login = $valor;
                break;
            case "password": $this->password = $valor;
                break;
            case "host": $this->host = $valor;
                break;
            case "nombre": $this->nombre = $valor;
                break;
            case "conexion": $this->conexion = $valor;
                break;
            case "debug": $this->debug = $valor;
                break;
            case "urlError": $this->urlError = $valor;
                break;
        }
    }

    /////////////////////////////////////////////////////////////////////////////////////
    // Constructor de clase.
    // inicializa los atributos de la clase con los valores de las constantes del archivo
    // de configuracion
    //
    //
    // parameter:
    // return:
    // access public
    //
    // Autor: Juan Diego Ocampo Q.
    // Fecha de Creacion: 11/04/2008
    //////////////////////////////////////////////////////////////////////////////////////
    function getAtributo($atributo) {
        switch ($atributo) {
            case "login": return $this->login;
                break;
            case "password": return $this->password;
                break;
            case "host": return $this->host;
                break;
            case "nombre": return $this->nombre;
                break;
            case "conexion": return $this->conexion;
                break;
            case "debug": return $this->debug;
                break;
            case "urlError": return $this->urlError;
                break;
        }
    }

}

?>